concrete5 8.5.0でREST API がサポートされたので試してみた
世の中のいろんな製品やサービスがAPIに対応していっておりますが、最近ではCMSもAPI対応のものがいくつかあり、concrete5もサポートを開始したようです。 ただし、まだ初期段階のようですので、コールできるAPIは限られておりますが。
ちなみにまだ公式ドキュメントには使い方の記載がないので、ソースコードを見て調べた結果になります。
前提
- concrete5 バージョン 5.8.5.0がインストールされていること
APIを有効にする方法
ダッシュボート画面のメニューシステムと設定
を選択します。
画面上のAPI設定
を選択します。
APIを有効化
にチェックをつけて、保存
ボタンを押します。
下記のように「API設定が更新されました」と表示されるので、有効化された認可タイプ
のうち、有効にするものにチェックをつけて保存
ボタンを押します。今回は試しにAPIをコールしてみるだけなので、全部チェックをつけておきます(この後の例で使うのはクライアント資格情報だけですが)。
下記のように「API設定が更新されました」と表示されるので、インテグレーションを追加
ボタンを押します。
今回はclient credentials(クライアント資格情報)
認証フローでAPIをコールするので、リダイレクト
欄は空欄にして、名前
だけ入力してインテグレーションを追加
ボタンを押します。
下記のように「インテグレーションが保存されました」と表示されるので、クライアントID
とクライアント秘密鍵
を控えておきます。クライアント秘密鍵はここで控えておかないと二度と確認することはできませんので、注意です。
APIをコールしてみる
アクセストークンの取得
下記にアクセスしてアクセストークンを取得します。
今回はclient credentials(クライアント資格情報)
認可フローでAPIをコールするので、grant_type
にclient_credentials
を指定します。scope
は、とりあえず今現在サポートしているものsystem site account
全てを指定しておきます。
curl -X POST \ --user {クライアントID}:{クライアント秘密鍵} \ --data-urlencode "grant_type=client_credentials" \ --data-urlencode "scope=system site account" \ http://(concrete5をインストールしたサーバードメイン)/(concrete5をインストールしたドキュメントルート)/index.php/oauth/2.0/token | jq
取得結果はこのようになります。
{ "token_type": "Bearer", "expires_in": 3600, "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6(・・・略・・・)" }
APIをコールするスクリプト
http通信ができれば何でも良いので、今回は下記のようなスクリプトを用意しました。
<?php require 'vendor/autoload.php'; use GuzzleHttp\Client; $token = "(取得したアクセストークン)"; try { $client = new Client(['base_uri' => "(concrete5をインストールしたサーバードメイン)"]); $response = $client->request( 'GET', "/(concrete5をインストールしたドキュメントルート)/index.php/ccm/api/v1/system/info", [ 'headers' => [ 'Authorization' => "Bearer " . $token, ], 'http_errors' => false, ]); $body = $response->getBody(); echo $body; } catch(\GuzzleHttp\Exception\ClientException $e){ print($e); }
/ccm/api/v1/system/infoをコールした結果
このようなシステム関連の情報が返ってきます。
{ "data": { "version": "8.5.0", "code_version": "8.5.0", "db_version": "20190301133300", "packages": "", "overrides": controllers/single_page/dashboard, controllers/single_page/top.php, controllers/single_page/test.php, controllers/single_page, single_pages/dashboard, single_pages/top.php, single_pages/test.php", "cache": "Block Cache - Off\nOverrides Cache - Off\nFull Page Caching - Off\nFull Page Cache Lifetime - Every 6 hours (default setting).", "server": "Apache/2.2.34 (Unix) mod_wsgi/3.5 Python/2.7.13 PHP/7.2.10 mod_ssl/2.2.34 OpenSSL/1.0.2o DAV/2 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.9 Perl/v5.24.0", "server_api": "apache2handler", "php_version": "7.2.10", "php_extensions": "apache2handler, bcmath, bz2, calendar, Core, ctype, curl, date, dom, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mysqli, mysqlnd, openssl, pcre, PDO, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, Reflection, session, SimpleXML, soap, sockets, sodium, SPL, sqlite3, standard, tokenizer, wddx, xml, xmlreader, xmlwriter, xsl, Zend OPcache, zip, zlib", "php_settings": "max_execution_time - 30\nlog_errors_max_len - 1024\nmax_file_uploads - 20\nmax_input_nesting_level - 64\nmax_input_time - 60\nmax_input_vars - 1000\nmemory_limit - 128M\npost_max_size - 8M\nupload_max_filesize - 32M\nldap.max_links - Unlimited\nmysqli.max_links - Unlimited\nmysqli.max_persistent - Unlimited\npcre.backtrack_limit - 1000000\npcre.recursion_limit - 100000\npgsql.max_links - Unlimited\npgsql.max_persistent - Unlimited\nsession.cache_limiter - <i>no value</i>\nsession.gc_maxlifetime - 7200\nsoap.wsdl_cache_limit - 5\nopcache.max_accelerated_files - 4000\nopcache.max_file_size - 0\nopcache.max_wasted_percentage - 5" } }
/ccm/api/v1/site/treesをコールした結果
サイトに関する情報が返ってきます。
{ "data": [ { "id": 1, "name": "concrete5demo5850", "icon": "" } ] }
おわりに
サポートが開始されたばかりなので、コンテンツ情報を取得するAPIは整備されてないようです。
今後APIが追加されていくと他サービスと組み合わせたり、今とは違った使い方ができるのではないかと思います。